package java学习.第18章_JDK8_17新特性;

/**
 *GC是Java主要优势之一。
 *  然而，当GC停顿太长，就会开始影响应用的响应时间。
 *  随着现代系统中内存不断增长，用户和程序员希望JVM能够以高效的方式充分利用这些内存，
 *  并且无需长时间的GC暂停时间。
 */

public class JDK之GC垃圾回收器的变化 {
/**
 * G1 GC
 * JDK9以后默认的垃圾回收器是 G1GC。
 * JDK10 : 为G1提供并行的 Full GC
 *      G1最大的亮点就是可以尽量的避免full gc。
 *      但毕竟是“尽量”，在有些情况下，G1就要进行full gc了，比如如果它无法足够快的回收内存的时候，
 *      它就会强制停止所有的应用线程然后清理。
 *
 *    在Java10之前，一个单线程版的标记-清除-压缩算法被用于full gc。
 *      为了尽量减少full gc带来的影响，在Java10中，
 *      就把之前的那个单线程版的标记-清除-压缩的full gc算法改成了支持多个线程同时full gc。
 *      这样也算是减少了full gc所带来的停顿，从而提高性能。
 *
 *      你可以通过-XX:ParallelGCThreads参数来指定用于并行GC的线程数。
 *
 * JDK12：可中断的 G1 Mixed GC
 *
 * JDK12：增强G1，自动返回未用堆内存给操作系统
 *
 * JDK12：Shenandoah GC：低停顿时间的GC.
 *      Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣布进行的一项垃圾收集器研究项目 Pauseless GC 的实现，
 *              旨在针对 JVM 上的内存收回实现低停顿的需求。
 *      Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms，暂停与堆大小无关等
 *
 * JDK15：Shenandoah 垃圾回收算法转正
 *
 *
 */

/**
 * 革命性的 ZGC
 * JDK11：引入革命性的 ZGC
 *
 *      ZGC，这应该是JDK11最为瞩目的特性，没有之一。
 *
 *      ZGC是一个并发、基于region、压缩型的垃圾收集器。
 *
 *      ZGC的设计目标是：支持TB级内存容量，暂停时间低（<10ms），对整个程序吞吐量的影响小于15%。
 *          将来还可以扩展实现机制，以支持不少令人兴奋的功能，
 *          例如多层堆（即热对象置于DRAM和冷对象置于NVMe闪存），或压缩堆。
 *
 * JDK13：ZGC:将未使用的堆内存归还给操作系统
 *
 * JDK14：ZGC on macOS和windows
 *      JDK14之前，ZGC仅Linux才支持。现在mac或Windows上也能使用ZGC了，示例如下：
 *       -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
 *      ZGC与Shenandoah目标高度相似，在尽可能对吞吐量影响不大的前提下，
 *       实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。
 *
 * JDK15：ZGC 功能转正
 *
 *      ZGC是Java 11引入的新的垃圾收集器，经过了多个实验阶段，自此终于成为正式特性。
 *
 *      但是这并不是替换默认的GC，默认的GC仍然还是G1；
 *          之前需要通过
 *              -XX:+UnlockExperimentalVMOptions  -XX:+UseZGC
 *          来启用ZGC，现在只需要-XX:+UseZGC就可以。
 *          相信不久的将来它必将成为默认的垃圾回收器。
 *
 *      ZGC的性能已经相当亮眼，用“令人震惊、革命性”来形容，不为过。
 *          未来将成为服务端、大内存、低延迟应用的首选垃圾收集器。
 *
 *      怎么形容 Shenandoah 和 ZGC 的关系呢？异同点大概如下：
 *
 *      相同点：性能几乎可认为是相同的
 *      不同点：ZGC是Oracle JDK的，根正苗红。
 *      而Shenandoah 只存在于 OpenJDK 中，因此使用时需注意你的JDK版本
 * JDK16：ZGC 并发线程处理
 *
 *  在线程的堆栈处理过程中，总有一个制约因素就是 safepoints 。
 *  在safepoints这个点，Java的线程是要暂停执行的，从而限制了GC的效率。
 *
 */
}
